/**
 * @file embedded_example.c
 * @brief HTTP下载库在嵌入式平台上的使用示例
 *
 * 本示例展示了如何在嵌入式系统中集成和使用HTTP下载库。
 * 包括初始化、配置、下载和清理等完整流程。
 */
#include "http_download.h"
#include <stdio.h>
#include <stdbool.h>

/**
 * @brief 嵌入式平台特有的日志输出函数
 * @param log_msg 日志信息
 */
void embedded_log_callback(const char* log_msg) {
    // 在实际嵌入式系统中，这里可以替换为平台特定的日志输出函数
    // 例如UART、串口、LCD等
    printf("[HTTP] %s\n", log_msg);
}

/**
 * @brief 下载进度回调函数
 * @param total_bytes 总字节数
 * @param downloaded_bytes 已下载字节数
 * @return 是否继续下载，true继续，false取消
 */
bool progress_callback(uint64_t total_bytes, uint64_t downloaded_bytes) {
    // 嵌入式系统中，可以根据需要更新进度条或LED指示灯
    if (total_bytes > 0) {
        static uint32_t last_percent = 0;
        uint32_t percent = (downloaded_bytes * 100) / total_bytes;
        
        // 每10%的进度更新一次（嵌入式系统中可根据需要调整频率）
        if (percent >= last_percent + 10 || percent == 100) {
            printf("Progress: %d%% (%llu/%llu bytes)\n", 
                   percent, downloaded_bytes, total_bytes);
            last_percent = percent;
        }
    }

    // 可以添加条件来取消下载
    // 例如：检测用户输入、看门狗等
    
    return true; // 继续下载
}

/**
 * @brief 检查系统资源（嵌入式系统特有）
 * @param required_bytes 需要的字节数
 * @return 是否有足够资源，true有，false没有
 */
bool check_system_resources(uint64_t required_bytes) {
    // 在实际应用中，这里应该检查系统剩余内存和存储空间
    // 此处仅作为示例返回true
    return true;
}

/**
 * @brief 主函数
 * @return 执行结果，0成功，非0失败
 */
int main(void) {
    printf("HTTP Download Library Embedded Example\n");
    printf("====================================\n");
    
    // 1. 初始化HTTP下载器
    printf("Initializing HTTP downloader...\n");
    if (http_download_init() != 0) {
        printf("Failed to initialize HTTP downloader: %s\n", 
               http_download_get_error());
        return -1;
    }
    printf("HTTP downloader initialized successfully.\n");
    
    // 2. 设置下载选项
    http_download_options_t options = {
        .url = "http://example.com/firmware.bin",  // 下载URL
        .save_path = "/data/firmware.bin",         // 保存路径
        .timeout_ms = 60000,                        // 60秒超时
        .buffer_size = 4096,                        // 4KB缓冲区（嵌入式系统建议使用较小缓冲区）
        .resume_download = true,                    // 支持断点续传
        .log_callback = embedded_log_callback       // 自定义日志回调
    };
    
    // 3. 检查系统资源
    if (!check_system_resources(1024 * 1024)) {  // 假设需要1MB空间
        printf("Not enough system resources for download\n");
        http_download_cleanup();
        return -1;
    }
    
    // 4. 执行下载
    printf("Starting download from %s\n", options.url);
    printf("Saving to %s\n", options.save_path);
    
    int result = http_download_file(&options, progress_callback);
    
    // 5. 处理下载结果
    if (result == 0) {
        printf("Download completed successfully!\n");
        // 下载成功后可以进行后续处理，如校验文件、更新固件等
    } else {
        printf("Download failed: %s\n", http_download_get_error());
        // 处理下载失败的情况
    }
    
    // 6. 清理资源
    printf("Cleaning up resources...\n");
    http_download_cleanup();
    
    printf("Example completed.\n");
    return result;
}

/**
 * @brief 如何在嵌入式系统中集成本示例的说明
 * 
 * 1. 将http_download.c和http_download.h添加到您的项目中
 * 2. 添加本示例文件到项目中
 * 3. 根据您的平台修改Makefile编译选项
 * 4. 根据实际需求修改以下部分：
 *    - 下载URL和保存路径
 *    - 超时时间和缓冲区大小
 *    - 日志输出函数，适配您的平台
 *    - 系统资源检查函数
 * 5. 编译并链接您的项目
 * 
 * 注意事项：
 * - 确保您的平台支持标准C库和socket API
 * - 对于资源极其受限的平台，可能需要进一步优化内存使用
 * - 在没有操作系统的平台上，可能需要适配网络接口和文件系统
 */